/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Domain;

import Berekenen.MaakMatrix;
import Berekenen.Tclaml;
import Draw.ColorSet;
import Exceptions.BelowOrEqualsToZeroException;
import Jama.Matrix;
import java.io.Serializable;

/**
 *
 * @author Memet
 */
public abstract class Materiaal implements Serializable, Comparable{

    Matrix q;
    String naam;
    int id;
    MateriaalSoort soort;
    double dikte;
    ColorSet color;
    String fabrikant;
    double e1;
    double e2;
    double e3;
    double nu12;
    double nu23;
    double nu31;
    double g12;
    double g23;
    double g31;
    double rho;
    double a1;
    double a2;
    double a3;


     boolean hide;


     /**
      * Maakt een nieuw leeg materiaal
      */
     public Materiaal()
    {
        dikte = 0;
     }


    /**
     * Maakt een nieuw materiaal
     * @param naam De naam van het materiaal
     * @param el de longitudinale stijfheid van het lamel (Pa)
     * @param et de transversale stijfheid van het lamel (Pa)
     * @param mult longitudinale transversale poissonverhouding van het lamel
     * @param glt longitudinale transversale glijdingsmodulus van het lamel (Pa)
     * @param rhol de dichtheid van het lamel (Km/m3)
     * @throws BelowOrEqualsToZeroException
     */
    public Materiaal(String naam, double el, double et, double mult, double glt, double rhol) throws BelowOrEqualsToZeroException {

        if(el <= 0 || et <= 0 || mult <= 0 || glt <= 0 || glt <= 0 || rhol <= 0)
        {
            throw new BelowOrEqualsToZeroException();
        }
        this.q = MaakMatrix.Q(el, et, mult, Tclaml.Mutl(mult, el, et), glt);
        this.e1 = el;
        this.e2 = et;
        this.nu12 = mult;
        this.g12 = glt;
        this.rho = rhol;
        this.naam = naam;
        this.id = -1;
        this.hide = false;
        this.a3 = 0;
        this.soort = MateriaalSoort.UNIDIRECTIONAAL;
    }

    /**
     * Het id van het materiaal
     * @return Het id van het materiaal
     */
    public int getId() {
        return id;
    }

    /**
     * Het id van het materiaal
     * @param id Het id van het materiaal
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * De longitudinale stijfheid van het lamel (Pa)
     * @return de longitudinale stijfheid van het lamel (Pa)
     */
    public double getEl() {
        return e1;
    }

    /**
     * de longitudinale stijfheid van het lamel (Pa)
     * @param el de longitudinale stijfheid van het lamel (Pa)
     */
    public void setEl(double el) {
        this.e1 = el;
    }

    /**
     * de transversale stijfheid van het lamel (Pa)
     * @return de transversale stijfheid van het lamel (Pa)
     */
    public double getEt() {
        return e2;
    }

    /**
     * de transversale stijfheid van het lamel (Pa)
     * @param et de transversale stijfheid van het lamel (Pa)
     */
    public void setEt(double et) {
        this.e2 = et;
    }

    /**
     * longitudinale transversale glijdingsmodulus van het lamel (Pa)
     * @return longitudinale transversale glijdingsmodulus van het lamel (Pa)
     */
    public double getGlt() {
        return g12;
    }

    /**
     * longitudinale transversale glijdingsmodulus van het lamel (Pa)
     * @param glt longitudinale transversale glijdingsmodulus van het lamel (Pa)
     */
    public void setGlt(double glt) {
        this.g12 = glt;
    }

    /**
     * longitudinale transversale poissonverhouding van het lamel
     * @return longitudinale transversale poissonverhouding van het lamel
     */
    public double getMult() {
        return nu12;
    }

    /**
     * longitudinale transversale poissonverhouding van het lamel
     * @param mult longitudinale transversale poissonverhouding van het lamel
     */
    public void setMult(double mult) {
        this.nu12 = mult;
    }

    /**
     * De Q matrix van het lamel
     * @return de Q matrix van het lamel
     */
    public Matrix getQ() {
        return q;
    }

    /**
     * De Q matrix van het lamel
     * @param q De Q matrix van het lamel
     */
    public void setQ(Matrix q) {
        this.q = q;
    }


    /**
     * de dichtheid van het lamel (Km/m3)
     * @return de dichtheid van het lamel (Km/m3)
     */
    public double getRhol() {
        return rho;
    }

    /**
     * de dichtheid van het lamel (Km/m3)
     * @param rhol de dichtheid van het lamel (Km/m3)
     */
    public void setRhol(double rhol) {
        this.rho = rhol;
    }

    /**
     * de naam van het materiaal
     * @return de naam van het materiaal
     */
    public String getNaam() {
        return naam;
    }

    /**
     * de naam van het materiaal
     * @param naam de naam van het materiaal
     */
    public void setNaam(String naam) {
        this.naam = naam;
    }

    /**
     * Textuele weergave van het object aangeduid met de naam
     * @return Naam van het materiaal
     */
    @Override
    public String toString()
    {
        //return naam + " " + "El: " + el + " Et:" + et;
        return naam;
    }


    public String matData()
    {
        String out = "<html>";
        out += "<b>"+naam+"</b><br /><br />";
        out += "<b>El:</b> " + e1/1e9 + " GPa <br />";
        out += "<b>Et:</b> " + e2/1e9 + " GPa <br />";
        out += "<b>μlt:</b> " + nu12 + "<br />";
        out += "<b>Glt:</b> " + g12/1e9 + " GPa <br />";
        out += "<b>ρ:</b> " + rho + " Kg/m<sup>3</sup> <br />";
        out += "</html>";
        return out;
    }


//    @Override
//    public String toString() {
//        String strEl = String.valueOf(el);
//        for(int i=6-strEl.length(); i>0; i--)
//        {
//            strEl = " " + strEl;
//        }
//
//
//        String strEt = String.valueOf(et);
//        for(int i=5-strEt.length(); i>0; i--)
//        {
//            strEt = " " + strEt;
//        }
//
//        String strID = String.valueOf(id);
//        for(int i=2-strID.length(); i>0; i--)
//        {
//            strID = " " + strID;
//        }
//
//        String strMult = String.valueOf(mult);
//        for(int i=5-strMult.length(); i>0; i--)
//        {
//            strMult = " " + strMult;
//        }
//
//        String strGlt = String.valueOf(glt);
//        for(int i=6-strGlt.length(); i>0; i--)
//        {
//            strGlt = " " + strGlt;
//        }
//
//        String strRhol = String.valueOf(rhol);
//        for(int i=6-strRhol.length(); i>0; i--)
//        {
//            strRhol = " " + strRhol;
//        }
//
//        String out = strID + "            " + strEl + "       " + strEt + "      " + strMult + "      " +strGlt+ "         "+strRhol+"         "+naam;
//        return out;
//    }

    /**
     * Of het object verborgen dient te worden
     * @return True/False
     */
    public boolean isHide() {
        return hide;
    }

    /**
     * Of het object verborgen dient te worden
     * @param hide True/False
     */
    public void setHide(boolean hide) {
        this.hide = hide;
    }

    @Override
    public boolean equals(Object obj)
    {
        boolean out = true;
        try{
        Materiaal m = (Materiaal) obj;
        out = (m.getNaam().compareTo(getNaam()) == 0 ? true : false);
/*        out = outm.getNaam().compareTo(getNaam()) && m.getEl() == getEl();
        out = out && m.getEt() == getEt();
        out = out && m.getGlt() == getGlt();
        out = out && m.getMult() == getMult();
        out = out && m.getRhol() == getRhol();
 */
        }
        catch(Exception ex)
        {
            //ex.printStackTrace();
            out = false;
        }
        finally{
        return out;}
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.e1) ^ (Double.doubleToLongBits(this.e1) >>> 32));
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.e2) ^ (Double.doubleToLongBits(this.e2) >>> 32));
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.nu12) ^ (Double.doubleToLongBits(this.nu12) >>> 32));
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.g12) ^ (Double.doubleToLongBits(this.g12) >>> 32));
        hash = 59 * hash + (int) (Double.doubleToLongBits(this.rho) ^ (Double.doubleToLongBits(this.rho) >>> 32));
        hash = 59 * hash + (this.naam != null ? this.naam.hashCode() : 0);
        hash = 59 * hash + this.id;
        return hash;
    }

    public MateriaalSoort getSoort() {
        return soort;
    }

    public void setSoort(MateriaalSoort soort) {
        this.soort = soort;
    }

    public double getDikte() {
        return dikte;
    }

    public void setDikte(double dikte) {
        this.dikte = dikte;
    }

    public ColorSet getColor() {
        return color;
    }

    public void setColor(ColorSet color) {
        this.color = color;
    }

    public String getFabrikant() {
        return fabrikant;
    }

    public void setFabrikant(String fabrikant) {
        this.fabrikant = fabrikant;
    }

    public double getE1() {
        return e1;
    }

    public void setE1(double e1) {
        this.e1 = e1;
    }

    public double getE2() {
        return e2;
    }

    public void setE2(double e2) {
        this.e2 = e2;
    }

    public double getE3() {
        return e3;
    }

    public void setE3(double e3) {
        this.e3 = e3;
    }

    public double getG12() {
        return g12;
    }

    public void setG12(double g12) {
        this.g12 = g12;
    }

    public double getG23() {
        return g23;
    }

    public void setG23(double g23) {
        this.g23 = g23;
    }

    public double getG31() {
        return g31;
    }

    public void setG31(double g31) {
        this.g31 = g31;
    }

    public double getNu12() {
        return nu12;
    }

    public void setNu12(double nu12) {
        this.nu12 = nu12;
    }

    public double getNu23() {
        return nu23;
    }

    public void setNu23(double nu23) {
        this.nu23 = nu23;
    }

    public double getNu31() {
        return nu31;
    }

    public void setNu31(double nu31) {
        this.nu31 = nu31;
    }

    public double getRho() {
        return rho;
    }

    public void setRho(double rho) {
        this.rho = rho;
    }

    public double getA1() {
        return a1;
    }

    public void setA1(double a1) {
        this.a1 = a1;
    }

    public double getA2() {
        return a2;
    }

    public void setA2(double a2) {
        this.a2 = a2;
    }

    public double getA3() {
        return a3;
    }

    public void setA3(double a3) {
        this.a3 = a3;
    }

}
